#include "drv_spi.h"

void spi_delay(void)
{
    uint16_t cnt = 5;

    while (cnt--);
}

void spi_gpio_config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = PIN_SPI_CS;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(PORT_SPI_CS, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_SPI_SCK;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(PORT_SPI_SCK, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_SPI_MISO;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(PORT_SPI_MISO, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = PIN_SPI_MOSI;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(PORT_SPI_MOSI, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_SetBits(GPIOC, GPIO_Pin_13);
}

void spi_initial(void)
{
    spi_gpio_config();
    SPI_CS_DISABLE;
    SPI_SCK_HIGH;
    SPI_MOSI_HIGH;
}

void spi_write_byte(uint8_t data)
{
    uint8_t cnt;

    for (cnt = 0; cnt < 8; cnt++)
    {
        SPI_SCK_LOW;               
        spi_delay();
        if (data & 0x80)         
            SPI_MOSI_HIGH;
        else
            SPI_MOSI_LOW;
        data <<= 1;
        spi_delay();
        SPI_SCK_HIGH;              
        spi_delay();
    }
}

uint8_t spi_read_byte(void)
{
    uint8_t cnt;
    uint8_t data = 0;
    for (cnt = 0; cnt < 8; cnt++)
    {
        SPI_SCK_LOW;                      
        spi_delay();
        data <<= 1;
        if (SPI_MISO_READ)                
            data |= 0x01;
        SPI_SCK_HIGH;                     
        spi_delay();
    }
    return data;
}
